package practice;

import java.util.*;

/**
 * 至少来自多少个小区
 */
public class FromHowManyHome {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (true) {
            int[] garden = Arrays.stream(sc.nextLine().split(" "))
                    .mapToInt(Integer::parseInt)
                    .toArray();
            int res = minNumberOfDistricts(garden);
            System.out.println(res);
        }
    }

    public static int minNumberOfDistricts(int[] garden) {
        // 使用HashMap存储每个数字及其出现次数，类似于Python中的Counter
        Map<Integer, Integer> counter = new HashMap<>();
        for (int num : garden) {
            counter.put(num, counter.getOrDefault(num, 0) + 1);  // 更新数字出现次数
        }

        // 初始化结果变量，用于存储至少来自多少个小区的小朋友
        int res = 0;

        // 遍历HashMap，计算至少需要多少个小区
        for (Map.Entry<Integer, Integer> entry : counter.entrySet()) {
            int key = entry.getKey();  // 获取每个小区的小朋友数量（除了自己）
            int count = entry.getValue();  // 获取该小区小朋友数量的实际出现次数（包括自己）

            // 如果小区的小朋友数量小于等于出现次数，则至少需要一个新的小区
            if (count <= key) {
                res += key + 1;  // 加1是因为要包含上报的孩子自身
            }
            // 如果小区的小朋友数量大于出现次数，则需要计算能容纳所有孩子的最少小区数
            else {
                res += ((key + 1) * (Math.ceil((double) count / (key + 1))) + count % (key + 1));
            }
        }
        return res;
    }
}
